﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace LecturaXML
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // StreamReader cargara el archivo y lo convertirá en un stream(cadena) 
            // lista para ser procesada.
            System.IO.StreamReader sr = new System.IO.StreamReader(@"auto.xml");

            // El Lector de Texto de XML
            System.Xml.XmlTextReader xr = new System.Xml.XmlTextReader(sr);

            // El Documento XML
            System.Xml.XmlDocument loteautoDoc = new System.Xml.XmlDocument();

            loteautoDoc.Load(xr);

            // Usando la propiedad InnerText nos dara solo los datos, debido a que
            // estamos en el nivel Documento Entero, nos dara todos los valores 
            // sin delimitador
            label1.Text = loteautoDoc.InnerText;


            // Navegamos desde el nodo raiz hasta el primer nodo hijo
            // Como se puede ver, esto nos dara el nodo de esquema XML
            // Obviamente no queremos esto
            label2.Text = "Primer nodo hijo: " + loteautoDoc.FirstChild.InnerText;

            // El NextSibling del FirstChild será el toteAuto.
            label3.Text = "Segundo nodo hijo: " + loteautoDoc.FirstChild.NextSibling.InnerText;

            // Una referencia al LoteAuto ...
            System.Xml.XmlNode loteauto = loteautoDoc.FirstChild.NextSibling;
            label4.Text = "Una referencia a  'loteauto': " + loteauto.InnerText;

            label5.Text = "Primer Hijo de loteauto: " + loteauto.FirstChild.InnerText;

            label6.Text = "Primer hijo del primer hijo de loteauto:" + loteauto.FirstChild.FirstChild.InnerText;

            // usando la metafora de Padre-Hijo(Parent-Child) es una manera de navegar dentro
            // de un documento XML.. pero puede ser muy tedioso y problemático porque
            // el document podria no estar formado adecuadamente(o sea podria no tener los nodos
            // correctos que la aplicación necesita)


            // Una otra manera de Navegar es utilizar una expression XPath.
            // XPath es mas sencilla, solo piensa en la jerarquia de nodos en terminos
            // de rutas, muy semejante a las rutas de directorios en el disco duro.
            // En nuestro ejemplo loteauto/auto/modelo

            //System.Xml.XmlNodeList loteAutoItems = loteautoDoc.SelectNodes("loteauto");
            System.Xml.XmlNodeList loteAutoItems = loteautoDoc.SelectNodes("loteauto/auto");

            System.Xml.XmlNode fabricante = loteAutoItems.Item(0).SelectSingleNode("fabricante");

            label7.Text = "fabricante.InnerText: " + fabricante.InnerText; 
        }
    }
}
